#ifndef ___operbits

#define ___operbits 1

unsigned long long obtenerBits(unsigned long long, unsigned char, unsigned char);
unsigned long long establecerBits(unsigned long long, unsigned char,
                                  unsigned char, unsigned long long);

unsigned long long obtenerBits (unsigned long long numeroEmpaquetado,
                                unsigned char inicio, unsigned char cantidad) {
  if ((!cantidad) || (((int) inicio + (int) cantidad) >
                      (8 * sizeof(unsigned long long)))) return 0;
  return ((numeroEmpaquetado >> inicio) & ((1 << cantidad) - 1));
}

unsigned long long establecerBits (unsigned long long numeroEmpaquetado,
                                   unsigned char inicio, unsigned char cantidad,
                                   unsigned long long valorAEstablecer) {
  unsigned long long mascara;
  if ((!cantidad) || (((int) inicio + (int) cantidad) >
                      (8 * sizeof(unsigned long long))))
    return numeroEmpaquetado;
  valorAEstablecer &= ((1 << cantidad) - 1);
  mascara = ((1 << cantidad) - 1) << inicio;
  numeroEmpaquetado &= mascara;
  return (numeroEmpaquetado | (valorAEstablecer << inicio));
}

#endif